package com.lxw.site.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.algorithms.Algorithm;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;

import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * token的工具类
 * @author 梁星武
 * @version 0.0.3
 * @description JWTUtil
 * @since 2021/5/15 23:00
 */
@Component
@Service
public class JWTUtil {
    /**
     * 密钥
     */
    @Value("${JWT_SECRET}")
    private String SECRET ;
    @Value("${JWT_EXPIRESECONDS}")
    private Integer EXPIRESECONDS;

    /**
     * 过期时间（单位：秒）
     **/
    private static final long EXPIRATION = 3600L;

    /**
     * 生成用户token,设置token超时时间
     *
     * @param userId
     * @param password
     * @return
     */
    @Deprecated
    public String createToken(Integer userId, String account, String password) {
        Map<String, Object> map = new HashMap<>();
        map.put("alg", "HS256");
        map.put("typ", "JWT");
        String token = JWT.create()
                // 添加头部
                .withHeader(map)
                // 放入用户的id
                .withAudience(String.valueOf(userId))
                // 可以将基本信息放到claims中
                .withClaim("account", account)
                .withClaim("password", password)
                // 超时设置,设置过期的日期
                .withExpiresAt(new Date(System.currentTimeMillis() + EXPIRATION * 1000))
                // 签发时间
                .withIssuedAt(new Date())
                // SECRET加密
                .sign(Algorithm.HMAC256(SECRET));
        return token;
    }

    /**
     * 生成token
     * @param payloadMap : 载体，参数
     * @param expireSeconds : 过期时间，单位为秒。可以穿null,0--使用配置文件中的
     * @return
     */
    public String generateJwt(Map<String,Object> payloadMap,Integer expireSeconds){
        System.out.println(payloadMap);
        System.out.println("获取到配置文件>>>"+EXPIRESECONDS);
        Calendar calendar = Calendar.getInstance();
        if (expireSeconds != null && expireSeconds != 0){
            calendar.add(Calendar.SECOND,expireSeconds);
        }else{
//            calendar.add(Calendar.DATE,7);//默认过期时间为七天
            calendar.add(Calendar.SECOND,EXPIRESECONDS);//默认为配置中设置的时间
        }
        String token = "";
        JWTCreator.Builder builder = JWT.create();
        //1.头部 默认即可
        //2.payload
        payloadMap.forEach((k,v)->{
            builder.withClaim(k, String.valueOf(v));
        });
        //3.签名
        token = builder.sign(Algorithm.HMAC256(SECRET));

//        String token = JWT.create().withClaim("username","张三")//设置自定义用户名
//        .withClaim("id",123)
//                .withExpiresAt(calendar.getTime())//设置过期时间
//        .sign(Algorithm.HMAC256("2312312321")) ;// 设置签名 保密且复杂
        return token ;
    }

    /**
     * 获取用户id
     */


    /**
     * 校验token并解析token
     */

}
